//@题目链接https://leetcode.cn/problems/minimum-absolute-difference-in-bst/
//中序遍历解法
class Solution {
public:
// 最小差必然产生于当前根节点与其左右子树根节点之间
// 也就是说如果是中序遍历的话，结果必然产生于相邻的两个遍历节点之间
    int getMinimumDifference(TreeNode* root) {
        stack<TreeNode*> st;
		//记录节点之间的差值
        int mVal = INT_MAX;
        TreeNode* pre = nullptr;
        while(!st.empty() || root){
            while(root){
                st.push(root);
                root = root->left;
            }
            root = st.top();
            st.pop();
			//存储最小差值
            if(pre != nullptr)    mVal = min(mVal,root->val - pre->val);
            pre = root;
            root = root->right;
        }
        return mVal;
    }
};

//递归中序解法
class Solution {
public:
// 最小差必然产生于当前根节点与其左右子树根节点之间
// 也就是说如果是中序遍历的话，结果必然产生于相邻的两个遍历节点之间
    void dfs(TreeNode* root, int& pre,int& cur){
        if(root == nullptr)     return;
        dfs(root->left,pre,cur);
        if(pre == -1){
            pre = root->val;
        }else{
            cur = min(cur,root->val - pre);
            pre = root->val;
        }
        dfs(root->right,pre,cur);
    }
    int getMinimumDifference(TreeNode* root) {
        int cur=INT_MAX,pre=-1;
        dfs(root,pre,cur);
        return cur;
    }
};